﻿using System.Collections.Generic;
using GigaSite.Domain.Entities;

namespace GigaSite.Domain.Interfaces.Repositories
{
    /// <summary>
    /// Абстрактный репозиторий Категорий в каталоге
    /// </summary>
    public interface ICategoriesRepository: IBaseRepository<Category>
    {
        /// <summary>
        /// Возвращает коллекцию корневых категорий каталога
        /// </summary>
        /// <returns>Коллекция категорий</returns>
        IEnumerable<Category> GetRootCategories();

        /// <summary>
        /// Возвращает коллекцию дочерних категорий указанной категории
        /// </summary>
        /// <param name="categoryId">Идентификатор категории</param>
        /// <returns>Коллекция категорий</returns>
        IEnumerable<Category> GetChildCategories(long categoryId);

        /// <summary>
        /// Возвращает коллекцию дочерних категорий указанной категории
        /// </summary>
        /// <param name="category">Объект категории</param>
        /// <returns>Коллекция категорий</returns>
        IEnumerable<Category> GetChildCategories(Category category);

        /// <summary>
        /// Возвращает коллекцию категорий для сущности указанного типа, возвращаются только не пустые категории
        /// </summary>
        /// <typeparam name="T">Тип сущности категории для которой нужно вычленить</typeparam>
        /// <returns>Иерархия категорий в которых есть сущности указанного типа</returns>
        IEnumerable<Category> GetNonEmptyCategories<T>() where T: class;

        /// <summary>
        /// Возвращает категорию с указанным системным именем
        /// </summary>
        /// <param name="systemName">Системное имя категории</param>
        /// <returns>Категория либо null</returns>
        Category GetCategoryBySystemName(string systemName);
    }
}